package num32II;

import java.util.ArrayList;
import java.util.LinkedList;
import java.util.List;
import java.util.Queue;

/**
 * @author : DuJiabao
 * @Date : 2021/1/22 17:06
 * @Project : sword-finger-offer
 * @File : null.java
 * @Desc :从上到下按层打印二叉树，同一层的节点按从左到右的顺序打印，每一层打印到一行。
 * https://leetcode-cn.com/problems/cong-shang-dao-xia-da-yin-er-cha-shu-ii-lcof/
 */

/**
 *
 */
public class Solution2 {
    public List<List<Integer>> levelOrder(TreeNode root) {
        List<List<Integer>> res = new ArrayList<>();
        Queue<TreeNode> queue = new LinkedList<>();
        if (root != null) queue.add(root); // 巧妙点一： 如果为空，则不添加任何元素，则不会进入下面的循环，就直接返回空的ArrayList
        while (!queue.isEmpty()) {
            List<Integer> temRes = new ArrayList<>();
            for (int i = queue.size(); i > 0; i--) { // 巧妙点二：为了保证每次循环的个数，都是该行的个数，这个循环采用倒序的方法，先赋初值，后面修改queue的时候，不担心因为添加了内容而导致出现bug
                TreeNode temp = queue.poll();
                temRes.add(temp.val);
                if (temp.left != null) queue.add(temp.left);
                if (temp.right != null) queue.add(temp.right);
            }
            res.add(temRes);
        }
        return res;
    }
}
